/*
package cumt.oj;

*/
/**
 * @Author Fizz Pu
 * @Date 2020/10/18 下午5:02
 * @Version 1.0
 * 失之毫厘，缪之千里！
 *//*



import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

*/
/**
 * 题目描述
 * xiaok大佬最近再雇佣工人给他掰木棒。把一根长为L的木棒锯成两段，他需要支付给工人L元钱。xiaok大佬一开始只有长为L的一根木棒，他想把它锯成n段，
 * 每段长度分别为L1,L2,...,Ln，问xiaok大佬最少要付给工人多少钱？
 *
 * 输入
 * 第一行两个整数n,L(1<n<103,n<L<109)
 *
 * 第二行n个整数L1,L2,...,Ln（0<Li<L,且保证L1+L2+...+Ln=L）
 *
 * 输出
 * 输出一个整数，表示最小花费
 * 样例输入
 * 3 21
 * 8 5 8
 * 样例输出
 * 34
 *//*


// 这个题有个关键点就是Li为整数，每段长度为整数
// 从i处划分，划分成i段和n-i段，那么就可以递归的解决问题
// 这还是一个最优解的问题，左边如果出现最优解，右边出现左右解，那么总结果就是最优的
// 当然会出现重复计算问题
// 这道题和矩阵连乘思路很像
// dp[i][j]表示表示把长度为i的木板分成j段
// dp[i][j] = dp[i][k] + dp[k][j] + sum(i:j)


class Main {
    public static long getMinCost(int length, int seg, long [] segLens){
        // 思路三
        // 1. 每次取最小的两个数合并
        PriorityQueue<Long> priorityQueue = new PriorityQueue<>();
        for(int i = 0; i < seg; ++i){
            priorityQueue.add(segLens[i]);
        }

        long minCost = 0;
        while (priorityQueue.size() > 1){
            long sums = priorityQueue.remove() + priorityQueue.remove();
            minCost +=  sums;
            priorityQueue.add(sums);
        }
        return minCost;
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int seg = scanner.nextInt(), len = scanner.nextInt();
        long[] segLens = new long[seg];
        for(int i = 0; i < seg; ++i){
            segLens[i] = scanner.nextLong();
        }
        System.out.println(getMinCost(len, seg, segLens));
    }
}
*/
